/**
 * @description H5+下载App
 * @param downloadUrl:App下载链接
 * @param progressCallBack:下载进度回调
 */
export const downloadApp = (downloadUrl, progressCallBack = () => {}) => {
    // 用于存储下载任务，便于管理
    let downloadTask = null;

    const cancelDownload = () => {
        if (downloadTask) {
            downloadTask.abort(); // 中止下载任务
            downloadTask = null;
        }
    };

    const promise = new Promise((resolve, reject) => {
        // 创建下载任务
        downloadTask = plus.downloader.createDownload(downloadUrl, {
            method: "GET"
        }, (task, status) => {
            if (status == 200) { // 下载成功
                resolve(task.filename);
            } else {
                reject('fail');
                uni.showToast({
                    title: '下载失败',
                    duration: 1500,
                    icon: "none"
                });
            }
        });

        // 监听下载过程
        downloadTask.addEventListener("statechanged", (task, status) => {
            switch (task.state) {
                case 1: // 开始
                    break;
                case 2: // 已连接到服务器
                    break;
                case 3: // 已接收到数据
                    let hasProgress = task.totalSize && task.totalSize > 0; // 是否能获取到App大小
                    if (hasProgress) {
                        let current = parseInt(100 * task.downloadedSize / task.totalSize); // 获取下载进度百分比
                        progressCallBack(current);
                    }
                    break;
                case 4: // 下载完成
                    break;
            }
        });

        // 开始执行下载
        downloadTask.start();
    });

    promise.cancelDownload = cancelDownload; // 将取消方法挂载到Promise对象上，便于调用
    return promise;
};

/**
 * @description H5+安装APP
 * @param fileName:app文件名
 * @param callBack:安装成功回调
 */
export const installApp = (fileName, callBack = () => {}) => {
    // 注册广播监听app安装情况
    onInstallListening(callBack);
    // 开始安装
    plus.runtime.install(plus.io.convertLocalFileSystemURL(fileName), {}, () => {
        // 成功跳转到安装界面
    }, function(error) {
        uni.showToast({
            title: '安装失败',
            duration: 1500,
            icon: "none"
        });
    });
};

/**
 * @description 注册广播监听APP是否安装成功
 * @param callBack:安装成功回调函数
 */
const onInstallListening = (callBack = () => {}) => {
    let mainActivity = plus.android.runtimeMainActivity(); // 获取activity
    // 生成广播接收器
    let receiver = plus.android.implements('io.dcloud.android.content.BroadcastReceiver', {
        onReceive: (context, intent) => { // 接收广播回调
            plus.android.importClass(intent);
            mainActivity.unregisterReceiver(receiver); // 取消监听
            callBack();
        }
    });
    let IntentFilter = plus.android.importClass('android.content.IntentFilter');
    let Intent = plus.android.importClass('android.content.Intent');
    let filter = new IntentFilter();
    filter.addAction(Intent.ACTION_PACKAGE_ADDED); // 监听APP安装
    filter.addDataScheme("package");
    mainActivity.registerReceiver(receiver, filter); // 注册广播
};

// 示例：退出页面时取消下载任务
let appDownloadPromise = null;

export const startDownload = (url, progressCallback) => {
    appDownloadPromise = downloadApp(url, progressCallback);
};

export const stopDownload = () => {
    if (appDownloadPromise && appDownloadPromise.cancelDownload) {
        appDownloadPromise.cancelDownload();
    }
};
